﻿using System.Collections.ObjectModel;

namespace WinFormedge.Blazor;

/// <summary>
/// A collection of <see cref="RootComponent"/> items.
/// </summary>
public class RootComponentsCollection : ObservableCollection<RootComponent>, IJSComponentConfiguration
{
    /// <inheritdoc />
    public JSComponentConfigurationStore JSComponents { get; } = new();
}


/// <summary>
/// Provides a set of extension methods for modifying collections of <see cref="IComponent"/> objects.
/// </summary>
public static class RootComponentCollectionExtensions
{
    /// <summary>
    /// Adds the component specified by <typeparamref name="TComponent"/> to the collection specified by
    /// <paramref name="components" /> to be associated with the selector specified by <paramref name="selector"/>
    /// and to be instantiated with the parameters specified by <paramref name="parameters"/>.
    /// </summary>
    /// <typeparam name="TComponent">The <see cref="IComponent"/> to add to the collection.</typeparam>
    /// <param name="components">The collection to which the component should be added.</param>
    /// <param name="selector">The selector to which the component will be associated.</param>
    /// <param name="parameters">The optional creation parameters for the component.</param>
    public static void Add<TComponent>(this RootComponentsCollection components, string selector, IDictionary<string, object?>? parameters = null)
        where TComponent : IComponent
    {
        components.Add(new RootComponent(selector, typeof(TComponent), parameters));
    }

    /// <summary>
    /// Removes the component associated with the specified <paramref name="selector"/> from the collection
    /// specified by <paramref name="components" /> .
    /// </summary>
    /// <param name="components">The collection from which the component associated with the selector should be removed.</param>
    /// <param name="selector">The selector associated with the component to be removed.</param>
    public static void Remove(this RootComponentsCollection components, string selector)
    {
        for (var i = 0; i < components.Count; i++)
        {
            if (components[i].Selector.Equals(selector, StringComparison.Ordinal))
            {
                components.RemoveAt(i);
                return;
            }
        }

        throw new ArgumentException($"There is no root component with selector '{selector}'.", nameof(selector));
    }
}